home *** CD-ROM | disk | FTP | other *** search
/ Technotools / Technotools (Chestnut CD-ROM)(1993).ISO / misc_pto / basic-c / labels.c < prev    next >
C/C++ Source or Header  |  1988-12-21  |  2KB  |  116 lines

  1. #include <stdio.h>
  2.  
  3. #include "defines.h"
  4.  
  5. extern char    *token, *prog;
  6. extern char    *getlabel();
  7. extern int    gettoken(), tokentype, tokenstat;
  8.  
  9. void    label_init();
  10.  
  11. struct label {            /* storage for the labels */
  12.     char    name[LAB_LEN];    /* label name */
  13.     char    *p;        /* points to place to go in source file */
  14. };
  15.  
  16. struct label label[NUM_LAB];
  17.  
  18. /*
  19.  * initlabels - find all labels
  20.  */
  21. void
  22. initlabels(ltoken)
  23. char    *ltoken;
  24. {
  25.     int    addr;
  26.     char    *temp;
  27.  
  28.     label_init();            /* zero all labels */
  29.     temp = prog;            /* save pointer to top of program */
  30.  
  31.     /* if the first token in the file is a label */
  32.     tokentype = gettoken(ltoken);
  33.     if (tokentype == NUMBER) {
  34.         strcpy(label[0].name, ltoken);
  35.         label[0].p = prog;
  36.     }
  37.  
  38.     geteol();
  39.     do {
  40.         tokentype = gettoken(ltoken);
  41.         if (tokentype == NUMBER) {
  42.             addr = getnext_label(ltoken);
  43.             if (addr == -1 || addr == -2) {
  44.                 if (addr == -1)
  45.                     b_error(5);
  46.                 else
  47.                     b_error(6);
  48.             }
  49.             strcpy(label[addr].name, ltoken);
  50.             label[addr].p = prog;    /* current point in program */
  51.         }
  52.         /* if not on a blank line, find next line */
  53.         if (tokenstat != EOL)
  54.             geteol();
  55.     } while (tokenstat != FINISHED);
  56.     prog = temp;    /* restore to original */
  57. }
  58.  
  59.  
  60. /*
  61.  * getnext_label - Return index of next free position in label array.
  62.  *
  63.  * returns:    -1 if the array is full.
  64.  *        -2 when duplicate label is found.
  65.  */
  66. getnext_label(s)
  67. char    *s;
  68. {
  69.     register int    t;
  70.  
  71.     for (t = 0; t < NUM_LAB; ++t) {
  72.         if (label[t].name[0] == 0)
  73.             return t;
  74.         if (!strcmp(label[t].name, s))
  75.             return (-2);    /* duplicate label */
  76.     }
  77.     return (-1);
  78. }
  79.  
  80.  
  81. /*
  82.  * getlabel - find location of given label.
  83.  *
  84.  * returns:    null if label is not found
  85.  *         pointer to the position of the label
  86.  */
  87. char    *
  88. getlabel(s)
  89. char    *s;
  90. {
  91.     register int    t;
  92.  
  93.     for (t = 0; t < NUM_LAB; ++t)
  94.         if (!strcmp(label[t].name, s))
  95.             return (label[t].p);
  96.     return NULL;    /* error condition */
  97. }
  98.  
  99.  
  100. /*
  101.  * label_init - initialize the array that holds the labels.
  102.  *
  103.  * By convention, a null label name indicates that array 
  104.  * position is unused.
  105.  */
  106. void
  107. label_init()
  108. {
  109.     register int    t;
  110.  
  111.     for (t = 0; t < NUM_LAB; ++t)
  112.         label[t].name[0] = NULL;
  113. }
  114.  
  115.  
  116.